package Try_Catch_finally;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    IO的异常处理：使用try_catch_finall
    格式：
        try{
            可能产生异常的代码(所有出现异常的代码)
        }catch(异常类变量 变量名){
            异常处理的逻辑
        }finally{
            一定会执行的代码
            资源释放
        }

 */
public class PracticeMain {
    public static void main(String[] args) {
       /*
        提高变量的作用域，为了让finally中的代码可以使用（因为之前的作用域只在try中）
        变量在定义的时候可以没有值，但是在使用的时候必须要有值
        若 FileInputStream fis = new FileInputStream("C:\\Users\\Lenovo\\想法复制.txt");这句话执行失败，
        则FileInputStream fis 就没有值，那么执行fis。close（）就会报错
        所以给这两个变量一个初始值null
        */
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream("C:\\Users\\Lenovo\\想法复制.txt");
            fos = new FileOutputStream("E:\\idea\\IntelliJ IDEA 2020.3\\perject_idea\\20210325\\c.txt");
            //使用字节输入流对象中的read（）方法去读取文件
            byte[] bytes = new byte[1024];
            int len2 = 0;
            while ((len2 = fis.read(bytes)) != -1){
                fos.write(bytes,0,len2);
            }


        }catch (IOException e){

        }finally {
            //如果前面创建对象失败了，则这里的fos，fis的默认值是null，就不能引用close（）对象了 ，所以需要增加一个判断，若不是null再把资源释放
           if(fos != null && fis != null){
               try {  //这两个方法声明抛出了IOException异常对象，所以就得处理这个异常对象，要么throws，要么try_catch
                   fos.close();
                   fis.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }

           }
        }
    }
}
